home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat39 / multiargs / multiarg.c next >
Encoding:
C/C++ Source or Header  |  1993-09-07  |  1.9 KB  |  84 lines

  1. /* multiargs : à utiliser avec ToolManager par exemple
  2.    multiargs <programme> <arg1> <arg2> ... <argn>
  3.    lance - programme <arg1>
  4.          - programme <arg2>
  5.          ...
  6.          - programme <argn>.
  7.    <programme> peut aussi être une ligne de commande complexe placée entre
  8.    guillemets; si elle contient %%, cela indique l'endroit où sera placé
  9.    l'argument. */
  10.  
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16.  
  17. int main(int argc, char *argv[]) {
  18.  
  19. /*    FILE *fout = fopen("raw:", "w");*/
  20.  
  21.     static char ligne[2048];
  22.  
  23.     if (--argc < 1 || !strcmp(argv[1], "?")) {
  24.         puts ("multiargs <programme> <arg1> <arg2> ... <argn>\n"
  25.               "lance  programme <arg1>\n"
  26.               "       programme <arg2>\n"
  27.               "       ...\n"
  28.               "       programme <argn>.\n"
  29.               "<programme> peut aussi être une ligne de commande complexe placée entre\n"
  30.               "guillemets; si elle contient %%, cela indique l'endroit où sera placé\n"
  31.               "l'argument.");
  32.         return 0;
  33.     }
  34.  
  35.     char *commande = *(argv + 1);
  36.     char ligne[256];
  37.     char *p = commande;
  38.     char *q = ligne;
  39.  
  40.     int quote = *p == '\"';
  41.     if (quote)
  42.         p++;
  43.  
  44.     while (*p && (*p != '%' || *(p + 1) != '%') && (!quote || *p != '\"'))
  45.         *q++ = *p++;
  46.  
  47.     if (*p == '%')
  48.         p += 2;
  49.     else
  50.         *q++ = ' ';
  51.  
  52.     char **argument = argv + 2;
  53.  
  54.     while (--argc) {
  55.         int valret;
  56.         char *r = q;
  57.  
  58.         char *s = *argument;
  59.         if (*s != '\"')
  60.             *r++ = '\"';
  61.         while (*s)
  62.             *r++ = *s++;
  63.         if (*(s - 1) != '\"')
  64.             *r++ = '\"';
  65.  
  66.         s = p;
  67.         while (*s && (!quote || *s != '\"'))
  68.             *r++ = *s++;
  69.  
  70.         *r = '\0';
  71. /*        fprintf(fout, "%s\n", ligne);*/
  72.         if ((valret = system(ligne)) >= 10)
  73.             return valret;
  74.  
  75.         ++argument;
  76.     }
  77.  
  78. /*    fflush(fout);
  79.     system("wait 20");
  80.     fclose(fout);
  81. */
  82.     return 0;
  83. }
  84.